// axios的配置
import axios from 'axios';
// 引入ElementUI中的全局提示方法
import { MessageBox,Message } from 'element-ui'

// 引入进度条
import nprogress from 'nprogress'

// 对axios进行一些简单的配置
// axios的公共配置
let http = axios.create({
    withCredentials: true,  // 是否携带凭证  比如cookie
    baseURL:'/api',  // 基础地址
    timeout:5000,  // 超时设置
})

// 请求拦截
// 假如右100个请求都需要携带相同的参数，在api接口中一个一个携带，重复，麻烦。拦截器可以拦截到每一个请求，然后进行添加参数，写一次就够
http.interceptors.request.use(function (config) {
    // config是请求对象，里面可以拿到请求的地址，参数等

    // 开启进度条
    nprogress.start()

    // 获取localStorage，中存储的token
    let token = localStorage.getItem('sw-token')
    config.headers.authorization = token
    
    // return config 就是放行
    return config

})

// 响应拦截
// 可以在这个拦截器中处理公共的错误
http.interceptors.response.use(config=>{
    // config是响应对象，里面可以拿到服务器响应的内容

    // 停止进度条
    nprogress.done()
    // console.log('============',config);
    // return config 就是放行
    // 嵌套解构语法
    let {data:{state,msg,code}} = config;
    // 10022 登入过期
    // 1004 token过期
    // 10026 没有权限

    // 防止进入没有权限死循环，工作中看权限码更改
    let codes = ['10022','1004','10026']
    if(codes.includes(code)){
        // 清除token
        localStorage.removeItem('sw-token')
        // 刷新页面
        location.reload()
    }

    // 一个需要排除掉不弹窗的接口
    let excludeUrl = ['/order/query_order_status']
    // 判断不需要弹窗的数组中是否包含当前的请求的这个路径
    let isExclude = excludeUrl.includes(config.config.url)

    // 拦截器判断后端响应的state
    if(!state && !isExclude){
        // 全局的提示
        MessageBox.alert(msg,'错误提示',{
            type:'error'
        })
    }
    return config
})



export default http; 
